
// 力扣83. 删除排序链表中的重复元素
  class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null) {
            return null;
        }
        ListNode curN = head.next;
        ListNode prev = head;
        while(curN != null) {
            if(curN.val == prev.val) {
                prev.next = curN.next;
                curN = curN.next;
            }else{
                curN = curN.next;
                prev = prev.next;
            }
        }
        return head;
    }
}




// 力扣85. 最大矩形
class Solution1 {
    public int maximalRectangle(char[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }

        int rows = matrix.length;
        int cols = matrix[0].length;
        int maxArea = 0;

        // dp[i][j] 表示第i行第j列位置左侧连续'1'的数量（包括自身）
        int[][] dp = new int[rows][cols];

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                // 计算当前位置左侧连续1的数量
                if (matrix[i][j] == '1') {
                    dp[i][j] = (j == 0) ? 1 : dp[i][j - 1] + 1;
                } else {
                    dp[i][j] = 0;
                }

                // 向上扩展，计算以当前位置为右下角的矩形面积
                int width = dp[i][j];
                if(width != 0) { // 为0不用算，算了也是0
                    for (int k = i; k >= 0; k--) {
                        // 高度为i - k + 1，宽度取当前列向上所有行中的最小值
                        if(dp[k][j] == 0) { // 为0就不用继续往上计算了，已经断节了
                            break;
                        }
                        width = Math.min(width, dp[k][j]);
                        int height = i - k + 1;
                        maxArea = Math.max(maxArea, width * height);
                    }
                }

            }
        }

        return maxArea;
    }
}
